package org.example.big_data.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.example.big_data.mapper.ArticleMapper;
import org.example.big_data.pojo.Article;
import org.example.big_data.pojo.PageBean;
import org.example.big_data.service.ArticleService;
import org.example.big_data.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    ArticleMapper articleMapper;
    //新增文章,传入的对象只有部分参数，需要补充参数
    @Override
    public void add(Article article) {
        article.setCreateTime(LocalDateTime.now());
        article.setUpdateTime(LocalDateTime.now());
        //需要外键当前用户id，从线程变量中获取
        Map<String, Object> map = ThreadLocalUtil.get();
        Integer userid = (Integer) map.get("id");
        article.setCreateUser(userid);
        articleMapper.add(article);
    }

    /**
     * 文章分页查询
     *  文章分页查询，返回值是PageBean类型的对象作为data，但是调用mapper中查询出的结果只是一个arraylist对象，因此需要手动创建pagebean对象
     *  涉及到分页查询，调用PageHelper.startPage()方法，传入当前页码和每页显示的条数
     *  PageHelper查询出的结果是一个page对象(不需要额外创建)。会补充到list这个列表里面。然后这个page的提供了一个方法，就是可以获取到分页查询后的这些数据。
     *  所以mapper查询出的返回的一个结果是一个list，然后我们把这个list的数组强制转化为一个page，
     *  PageHelper查询出的结果是一个page对象(不需要额外创建)。会补充到list这个列表里面。然后这个page对象的提供了一个方法，page.getResult()就是可以获取到分页查询后的这些数据。
     *  mapper查询出的返回的一个结果是一个list，List类型是Page类型的父类，根据多态，父类List不能调用子类Page中特有的方法，所以需要把这个list的数组强制转化为一个page，
     *  page.getTotal()  page对象提供的方法，获取总记录数
     *  page.getResult()  page对象提供的方法，获取当前页的数据
     */

    @Override
    public PageBean<Article> list(Integer pageNum, Integer pageSize, Integer categoryId, String state) {

        //创建PageBean对象
        PageBean<Article> pageBean = new PageBean<>();
        //使用Mybatis的分页插件，传入当前页码和每页显示的条数，startPage方法开启分页查询，自动产生一个查询，返回一个page对象
        PageHelper.startPage(pageNum, pageSize);

        //除此之外，还需要根据当前用户id来查询当前用户创建的文章，逻辑上只能查询修改自己的文章，因此需要在mapper中传入当前用户id
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userid = (Integer) map.get("id");
        //mapper方法应当返回一个List，其中每个元素是一个article对象//调用mapper查询，pageSize，pageNum会自动传入，不需要手动传入
        List<Article> list = articleMapper.list(userid ,categoryId, state);
        //PageHelper查询出的结果是一个page对象(不需要额外创建)。会补充到list这个列表里面。然后这个page的提供了一个方法，就是可以获取到分页查询后的这些数据。
        //    mapper查询出的返回的一个结果是一个list，List类型是Page类型的父类，根据多态，父类List不能调用子类Page中特有的方法，所以需要把这个list的数组强制转化为一个page，
        Page<Article> page = (Page<Article>) list;
        // 把数据填充到创建的pageBean对象中，作为返回数据
        pageBean.setTotal(page.getTotal());  //page.getTotal()  page对象提供的方法，获取总记录数
        pageBean.setItems(page.getResult());  //page.getResult()  page对象提供的方法，获取根据传入的“当前页码”和“每页显示的条数”，查询出来的结果
        return pageBean;
    }

    //3 文章详情查询
    @Override
    public Article detail(Integer id) {
        return articleMapper.detail(id);
    }

    //4 更新文章
    @Override
    public void update(Article article) {
        article.setUpdateTime(LocalDateTime.now());
        //根据id先查找到文章，取出文章的创建用户id，与当前登录用户id进行比较，如果不一致，返回错误信息
        Article article1 = articleMapper.detail(article.getId());
        if (article1 == null) {
            throw new RuntimeException("文章不存在");
        }
        //获取当前登录用户id
        Map<String, Object> map = ThreadLocalUtil.get();
        Integer userid = (Integer) map.get("id");
        //如果不一致，返回错误信息
        if (!userid.equals(article1.getCreateUser())) {
            throw new RuntimeException("您没有权限修改该文章");
        }
        articleMapper.update(article);
    }

    //5 删除文章
    @Override
    public void delete(Integer id) {
        //根据id先查找到文章，取出文章的创建用户id，与当前登录用户id进行比较，如果不一致，返回错误信息
        Article article1 = articleMapper.detail(id);
        if (article1 == null) {
            throw new RuntimeException("文章不存在");
        }
        //获取当前登录用户id
        Map<String, Object> map = ThreadLocalUtil.get();
        Integer userid = (Integer) map.get("id");
        //如果不一致，返回错误信息
        if (!userid.equals(article1.getCreateUser())) {
            throw new RuntimeException("您没有权限删除该文章");
        }
        articleMapper.delete(id);
    }
}
